"""
Case Type   : 共享存储-系统内部工具-dsscmd
Case Name   : dsscmd工具获取配置项
Create At   : 2023/4/21
Owner       : opentestcase019
Description :
    1.获取配置项，查看帮助信息
    2.获取配置项，不指定参数
    3.获取配置项，指定-n name参数为有效值
    4.获取配置项，指定-n name参数为无效值
    5.在dss关闭的情况下执行获取配置项
    6.在集群停止的情况下执行
    7.DSS_HOME路径权限不足时，获取配置项
    8.在备机获取配置项
    9.获取配置项，指定-U UDS:socket_domain参数为正常值
    10.获取配置项，指定指定错误的-U UDS:socket_domain参数和权限不足的socket_domain
Expect      :
    1.查看成功
    2.合理报错
    3.获取成功
    4.合理报错
    5.合理报错
    6.合理报错
    7.合理报错
    8.获取成功
    9.获取成功
    10.合理报错
History     :
"""
import os
import time
import re
import unittest
from yat.test import Node
from yat.test import macro
from testcase.utils.Logger import Logger
from testcase.utils.Common import Common
from testcase.utils.CommonSH import CommonSH
from testcase.utils.Constant import Constant

Primary_SH = CommonSH('PrimaryDbUser')


@unittest.skipIf(1 == Primary_SH.get_node_num(), '单机环境不执行')
class ShareStorageTool(unittest.TestCase):
    def setUp(self):
        self.logger = Logger()
        self.logger.info(f"-----{os.path.basename(__file__)} start-----")
        self.primary_node = Node('PrimaryDbUser')
        self.primary_sh = CommonSH('PrimaryDbUser')
        self.standby_node = Node('Standby1DbUser')
        self.common = Common()
        self.constant = Constant()

    def test_sharestorage_tool(self):
        step1 = "-----step1:获取配置项，查看帮助信息;expect:查看成功-----"
        self.logger.info(step1)
        execute_cmd = f"source {macro.DB_ENV_PATH};dsscmd getcfg -h"
        self.logger.info(execute_cmd)
        execute_msg = self.common.get_sh_result(self.primary_node, execute_cmd)
        self.assertIn('Usage:dsscmd getcfg <-n name> [-U UDS:socket_domain]\n'
                      '[client command] get config value by name\n'
                      '-n/--name <name>, <required>, the config name to set\n'
                      '-U/--UDS <UDS:socket_domain>, [optional], the unix '
                      'socket path of dssserver, default value '
                      'is UDS:$DSS_HOME/.dss_unix_d_socket',
                      execute_msg, "执行失败" + step1)

        step2 = "-----step2:获取配置项，不指定参数;expect:合理报错-----"
        self.logger.info(step2)
        execute_cmd = f"source {macro.DB_ENV_PATH};" \
                      f"dsscmd getcfg;"
        self.logger.info(execute_cmd)
        execute_msg = self.common.get_sh_result(self.primary_node, execute_cmd)
        self.assertIn('args [-n|--name] needs input value.',
                      execute_msg, "执行失败" + step2)

        step3 = "-----step3:获取配置项，指定-n name参数为有效值;expect:获取成功-----"
        self.logger.info(step3)
        execute_cmd = f'''source {macro.DB_ENV_PATH};
            dsscmd getcfg -n _log_LEVEL;
            dsscmd getcfg --name _LOG_BACKUP_FILE_COUNT;'''
        self.logger.info(execute_cmd)
        execute_msg = self.common.get_sh_result(self.primary_node, execute_cmd)
        self.assertEquals(2, execute_msg.count("Succeed to get cfg"),
                          "执行失败" + step3)

        step4 = "-----step4:获取配置项，指定-n name参数为无效值;expect:合理报错-----"
        self.logger.info(step4)
        execute_cmd = f'''source {macro.DB_ENV_PATH};
            dsscmd getcfg -n _log_level参数 ;
            dsscmd getcfg --name _LOG_BACKUP_FILE_COUNT_NOT_EXISTS;
            dsscmd getcfg -n _LOG_MAX_FILE_SIZE@#% '''
        self.logger.info(execute_cmd)
        execute_msg = self.common.get_sh_result(self.primary_node, execute_cmd)
        self.assertEquals(2, execute_msg.count(
            "The name's letter should be [alpha|digit|-|_]"),
                          "执行失败" + step4)
        self.assertIn('Failed to get cfg', execute_msg, "执行失败" + step4)

        step5 = "-----step5:在dss关闭的情况下执行获取配置项;expect:合理报错-----"
        self.logger.info(step5)
        execute_cmd = f'''source {macro.DB_ENV_PATH};
            dsscmd stopdss;sleep 2;
            dsscmd getcfg -n _LOG_LEVEL;
            dsscmd getcfg --name _LOG_BACKUP_FILE_COUNT'''
        self.logger.info(execute_cmd)
        execute_msg = self.common.get_sh_result(self.primary_node, execute_cmd)
        self.assertEquals(2, execute_msg.count(
            self.constant.failed_to_get_uds_connection), "执行失败" + step5)

        step6 = "-----step6:在集群停止的情况下执行;expect:合理报错-----"
        self.logger.info(step6)
        stop_msg = self.primary_sh.exec_cm_ctl(mode='stop')
        self.logger.info(stop_msg)
        self.assertIn(self.constant.cm_stop_success_msg,
                      stop_msg, '执行失败' + step6)
        execute_cmd = f'''source {macro.DB_ENV_PATH};
            dsscmd getcfg -n _LOG_LEVEL;
            dsscmd getcfg --name _LOG_BACKUP_FILE_COUNT;'''
        self.logger.info(execute_cmd)
        execute_msg = self.common.get_sh_result(self.primary_node, execute_cmd)
        self.assertEquals(2, execute_msg.count(
            self.constant.failed_to_get_uds_connection), "执行失败" + step6)
        start_msg = self.primary_sh.exec_cm_ctl(mode='start')
        self.logger.info(start_msg)
        self.assertIn(self.constant.cm_start_success_msg, start_msg,
                      '启动集群失败')
        time.sleep(30)
        status = self.primary_sh.exec_cm_ctl(mode='query', param='-Cv')
        self.logger.info(status)
        self.assertIn('cluster_state   : Normal', status, '执行失败')

        step7 = "-----step7:DSS_HOME路径权限不足时，获取配置项;expect:合理报错-----"
        self.logger.info(step7)
        execute_cmd = f'''source {macro.DB_ENV_PATH};
            chmod 000 {macro.DSS_INSTANCE};
            dsscmd getcfg -n _LOG_LEVEL;
            dsscmd getcfg --name _LOG_BACKUP_FILE_COUNT;
            chmod 700 {macro.DSS_INSTANCE};'''
        self.logger.info(execute_cmd)
        execute_msg = self.common.get_sh_result(self.primary_node, execute_cmd)
        self.assertEquals(2, execute_msg.count(
            self.constant.failed_to_get_uds_connection), "执行失败" + step7)

        step8 = "-----step8:在备机获取配置项;expect:获取成功-----"
        self.logger.info(step8)
        execute_cmd = f'''source {macro.DB_ENV_PATH};
            dsscmd getcfg -n _LOG_LEVEL;
            dsscmd getcfg --name _LOG_BACKUP_FILE_COUNT;'''
        self.logger.info(execute_cmd)
        execute_msg = self.common.get_sh_result(self.standby_node, execute_cmd)
        self.assertEquals(2, execute_msg.count("Succeed to get cfg"),
                          "执行失败" + step8)

        step9 = "-----step9:获取配置项，指定-U UDS:socket_domain参数为正常值;expect:获取成功-----"
        self.logger.info(step9)
        execute_cmd = f'''source {macro.DB_ENV_PATH};
            dsscmd getcfg -n _log_LEVEL -U {macro.UDS_PATH};'''
        self.logger.info(execute_cmd)
        execute_msg = self.common.get_sh_result(self.primary_node, execute_cmd)
        self.assertIn('Succeed to get cfg', execute_msg, '执行失败' + step9)

        step10 = "-----step10:获取配置项，指定指定错误的-U UDS:socket_domain" \
                 "参数和权限不足的socket_domain;expect:合理报错-----"
        self.logger.info(step10)
        execute_cmd = f'''source {macro.DB_ENV_PATH};
            dsscmd getcfg -n _log_LEVEL -U {macro.UDS_PATH}.cfg;
            chmod 000 {macro.UDS_PATH[4::]};
            dsscmd getcfg -n _log_LEVEL -U {macro.UDS_PATH};
            chmod 600 {macro.UDS_PATH[4::]};'''
        self.logger.info(execute_cmd)
        execute_msg = self.common.get_sh_result(self.primary_node, execute_cmd)
        self.assertEquals(2, execute_msg.count(
            self.constant.failed_to_get_uds_connection), "执行失败" + step10)

    def tearDown(self):
        self.logger.info("-----无需清理环境-----")
        self.logger.info(f"-----{os.path.basename(__file__)} end-----")
